/**
 * 给你一个含重复值的二叉搜索树（BST）的根节点 root ，找出并返回 BST 中的所有 众数（即，出现频率最高的元素）。
 *
 * 如果树中有不止一个众数，可以按 任意顺序 返回。
 *
 * 假定 BST 满足如下定义：
 *
 * 结点左子树中所含节点的值 小于等于 当前节点的值
 * 结点右子树中所含节点的值 大于等于 当前节点的值
 * 左子树和右子树都是二叉搜索树
 *https://leetcode.cn/problems/find-mode-in-binary-search-tree/
 *采用中序遍历，采用链表更新答案
 */
class FindMode {
    List<Integer> ret=new ArrayList<>();
    int num,count,maxCount;
    public int[] findMode(TreeNode root) {
        dfs(root);
        int len=ret.size();
        int[] ans=new int[len];
        for(int i=0;i<len;i++){
            ans[i]=ret.get(i);
        }
        return ans;
    }
    public void dfs(TreeNode root){
        if(root==null){
            return;
        }
        dfs(root.left);
        update(root.val);
        dfs(root.right);
    }
    public void update(int val){
        if(num==val){
            count++;
        }else{
            count=1;
            num=val;
        }
        if(count==maxCount){
            ret.add(num);
        }
         if(count>maxCount){
            maxCount=count;
            ret.clear();
            ret.add(num);
        }
    }

}